/*
 * FuzzyPID.h
 *
 *  Created on: 2021年11月18日
 *      Author: CameronLee
 */

#ifndef FUZZYPID_FUZZYPID_H_
#define FUZZYPID_FUZZYPID_H_


#include "main.h"
#include "hm_interaction.h"


/*          结构体                */
//增量式PID
typedef struct{

	float P;			//比例常数
	float I;			//积分常数
	float D;			//微分常数
	float LastError;		//上次偏差值
	float Errorsum;		//上上次偏差值
	float KP;			//Fuzzy Controller adjusting
	float KI;
	float KD;
}PID;

//模糊状态
typedef struct
{
	uint8_t	 flag1;
	uint8_t  flag2;
	float  coefficient;  //flag1 的 隶属度
}FuzzyFlag;


//  模糊化
#define ENB(x,y) 			((x>=y*e[0][0])&&(x<=y*e[0][2]))
#define ENM(x,y) 			((x>=y*e[1][0])&&(x<=y*e[1][2]))
#define ENS(x,y) 			((x >= y*e[2][0]) && (x <= y*e[2][2]) )
#define EZO(x,y) 			((x >= y*e[3][0]) && (x <= y*e[3][2]) )
#define EPS(x,y) 			((x >= y*e[4][0]) && (x <= y*e[4][2]) )
#define EPM(x,y) 			((x >= y*e[5][0]) && (x <= y*e[5][2]) )
#define EPB(x,y) 			((x >= y*e[6][0]) && (x <= y*e[6][2]) )
#define ENONE(x,y) 		((x < y*e[0][0]) || (x > y*e[6][2] ))

#define ECNB(x,y) 		((x >= y*ec[0][0]) && (x <= y*ec[0][2]))
#define ECNM(x,y) 		((x >= y*ec[1][0]) && (x <= y*ec[1][2]))
#define ECNS(x,y) 		((x >= y*ec[2][0]) && (x <= y*ec[2][2]))
#define ECZO(x,y) 		((x >= y*ec[3][0]) && (x <= y*ec[3][2]))
#define ECPS(x,y) 		((x >= y*ec[4][0]) && (x <= y*ec[4][2]))
#define ECPM(x,y) 		((x >= y*ec[5][0]) && (x <= y*ec[5][2]))
#define ECPB(x,y) 		((x >= y*ec[6][0]) && (x <= y*ec[6][2]))
#define ECNONE(x,y) 		((x < y*ec[0][0]) || (x > y*ec[6][2]))

//  PID 结构体参数
#define		NB		0
#define		NM		1
#define		NS		2
#define		ZO		3
#define		PS		4
#define		PM		5
#define		PB		6

#define		A 		0.013 	  //KP 系数  调整KP规则 小于目标值 且待加热时 加的多了 应该不变或者减小
#define		B 		0.01 		// KI 系数
#define		C 		0.018	//KD 系数

#define		E_c 		3		  //E  论域系数 标准最大值为 20
#define		EC_c 		0.1		//EC 论域系数 标准最大值为 10

#define   E_Membership 0
#define   EC_Membership 1

//   这里 P I D 的论域 都设置为【-3，3】
//可改变上面三个系数的大小来改变论域
#define		KNB		-1
#define		KNM		-0.6
#define		KNS		-0.2
#define		KZO		0
#define		KPS		1
#define		KPM		2
#define		KPB		3

//仅仅是初值，可以全部设为0 Fuzzy Controller 会自己调整
#define PID_P_Set						2.1
#define PID_I_Set						0.18
#define PID_D_Set  					0.01


#define PID_Pout_MAX   48
#define PID_Pout_MIN   0

#define I_Out_Part_MAX 8
#define I_Out_Part_MIN -8


/*       函数           */
float Fuzzy_PID_Contrl(PID* sptr,float deta_T);
void Fuzzy_PID_Arg_Init(PID* sptr);





#endif /* FUZZYPID_FUZZYPID_H_ */
